home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 051-060 / amok58 / sysdis / sysdis.mod < prev    next >
Text File  |  1993-11-04  |  5KB  |  201 lines

  1. (*---------------------------------------------------------------------------
  2.   :Program.     SysDis.mod
  3.   :Contents.    Disassembler für die System-Routinen
  4.   :Author.      Christian Stiens
  5.   :Address.     Heustiege 2, W-4710 Lüdinghausen
  6.   :Copyright.   PD
  7.   :Language.    Oberon
  8.   :Translator.  Amiga Oberon V2.09 [fbs]
  9.   :History.     V1.0, 23-Aug-91
  10.   :Imports.     MyArguments, DisAss
  11. ---------------------------------------------------------------------------*)
  12.  
  13. MODULE SysDis;
  14.  
  15.   IMPORT
  16.     io,Break,
  17.     c   : Conversions,
  18.     arg : MyArguments, (* kompatibel zu Arguments, erlaubt bei WB-Start die
  19.                           Eingabe der Argumente über Tastatur.
  20.                           Liegt aus rechtlichen Gründen nicht bei *)
  21.     da  : DisAss,
  22.     d   : Dos,
  23.     e   : Exec,
  24.     st  : Strings,
  25.     sys : SYSTEM;
  26.  
  27.   CONST
  28.     error    = 0;
  29.     library  = 1;
  30.     device   = 2;
  31.     resource = 3;
  32.  
  33.     usage = "Usage: SysDis <lib|dev|resourcename> <offset> [<numlines>]\n   or: SysDis <adr> [<numlines>]\n";
  34.  
  35.   VAR
  36.     ioreq : e.IOStdReq;
  37.     name  : ARRAY 80 OF CHAR;
  38.     str   : ARRAY 80 OF CHAR;
  39.     lib   : e.LibraryPtr;
  40.     ptr   : POINTER TO STRUCT jmp:INTEGER; adr:LONGINT END;
  41.     offs  : LONGINT;
  42.     lines : LONGINT;
  43.     size  : INTEGER;
  44.     type  : INTEGER;
  45.     adr   : e.ADDRESS;
  46.     line  : da.Line;
  47.     unit  : LONGINT;
  48.  
  49.   PROCEDURE GetType(VAR str: ARRAY OF CHAR): INTEGER;
  50.     VAR point : INTEGER;
  51.         str2  : ARRAY 80 OF CHAR;
  52.   BEGIN
  53.     IF str[0] = 0X THEN RETURN error END;
  54.     point := st.Occurs(str,".");
  55.     IF point < 0 THEN
  56.       st.Append(str,".library");
  57.     END;
  58.     point := st.Occurs(str,".");
  59.     IF point < 0 THEN RETURN error END;
  60.     st.Cut(str,point+1,st.Length(str)-point,str2);
  61.     IF    str2 =  "library" THEN RETURN library
  62.     ELSIF str2 =   "device" THEN RETURN device
  63.     ELSIF str2 = "resource" THEN RETURN resource
  64.     END;
  65.     RETURN error;
  66.   END GetType;
  67.  
  68.   PROCEDURE Usage;
  69.   BEGIN
  70.     io.closeDelay := 150;
  71.     io.WriteString(usage);
  72.     HALT(0)
  73.   END Usage;
  74.  
  75. BEGIN
  76.  
  77.   lib := NIL;
  78.   IF arg.NumArgs() = 0 THEN Usage END;
  79.   arg.GetArg(1,str);
  80.   IF str[0] = "?" THEN Usage END;
  81.  
  82.   IF c.StringToInt(str,adr) THEN
  83.  
  84.     IF arg.NumArgs() > 1 THEN
  85.       arg.GetArg(2,str);
  86.       IF ~c.StringToInt(str,lines) THEN Usage END;
  87.     ELSE
  88.       lines := -1;
  89.     END;
  90.  
  91.   ELSE
  92.  
  93.     IF arg.NumArgs() < 2 THEN Usage END;
  94.     arg.GetArg(1,name);
  95.     type := GetType(name);
  96.  
  97.     IF type = error THEN
  98.       io.WriteString("Wrong name\n");
  99.       HALT(0)
  100.     END;
  101.  
  102.     CASE type OF
  103.     | library:
  104.       lib := e.OpenLibrary(name,0);
  105.     | device:
  106.       unit := 0;
  107.       IF st.Occurs(name,"console") = 0 THEN unit := -1 END;
  108.       IF e.OpenDevice(name,unit,sys.ADR(ioreq),LONGSET{})=0 THEN
  109.         lib := sys.VAL(LONGINT,ioreq.device);
  110.       ELSE
  111.         lib := NIL
  112.       END;
  113.     | resource:
  114.       lib := e.OpenResource(name);
  115.     END;
  116.  
  117.     IF lib = NIL THEN
  118.       io.WriteString("Can't open "); io.WriteString(name); io.WriteLn;
  119.       HALT(0)
  120.     END;
  121.  
  122.     size := lib.negSize;
  123.  
  124.     arg.GetArg(2,str);
  125.     IF ~c.StringToInt(str,offs) THEN Usage END;
  126.  
  127.     IF arg.NumArgs() > 2 THEN
  128.       arg.GetArg(3,str);
  129.       IF ~c.StringToInt(str,lines) THEN Usage END;
  130.     ELSE
  131.       lines := -1;
  132.     END;
  133.  
  134.     io.WriteString(name); io.WriteString(" found at ");
  135.     io.WriteHex(lib,8); io.WriteString("H.\n");
  136.  
  137.     offs := offs DIV 6 * 6;
  138.  
  139.     IF (offs < -size) OR (offs > -6) THEN
  140.       io.WriteString("Offset out of Range\n");
  141.       HALT(0)
  142.     END;
  143.  
  144.     ptr := sys.VAL(LONGINT,lib) + offs;
  145.  
  146.     IF ptr.jmp # 04EF9H THEN
  147.       io.WriteString("I'm confused with the jump-table\n");
  148.       HALT(0);
  149.     END;
  150.  
  151.     adr := ptr.adr;
  152.  
  153.     io.WriteString("Routine with offset ");
  154.     io.WriteInt(offs,1); io.WriteString(" lies at address ");
  155.     io.WriteHex(adr,8); io.WriteString("H.\n\n");
  156.  
  157.   END(*IF*);
  158.  
  159.   IF lines < 0 THEN
  160.     IF ~d.IsInteractive(d.Input()) OR ~d.IsInteractive(d.Output()) THEN
  161.       lines := 100
  162.     END;
  163.   END;
  164.  
  165.   IF lines >= 0 THEN
  166.     WHILE lines > 0 DO
  167.       Break.CheckBreak;
  168.       adr := da.Disass(line,adr,0);
  169.       io.WriteString(line.s); io.WriteLn;
  170.       DEC(lines);
  171.     END;
  172.   ELSE
  173.     REPEAT
  174.       lines := 20; WHILE lines > 0 DO
  175.         Break.CheckBreak;
  176.         adr := da.Disass(line,adr,0);
  177.         io.WriteString(line.s); io.WriteLn;
  178.         DEC(lines);
  179.       END;
  180.       io.WriteString("-- More? ");
  181.       io.ReadString(str);
  182.       io.WriteString("\x0B\r");
  183.     UNTIL (CAP(str[0])="N") OR (CAP(str[0])="X") OR (CAP(str[0])="Q");
  184.   END;
  185.  
  186. CLOSE
  187.  
  188.   IF lib # NIL THEN
  189.     CASE type OF
  190.       library: e.CloseLibrary(lib) |
  191.       device:  e.CloseDevice(sys.ADR(ioreq))
  192.     ELSE
  193.     END;
  194.   END;
  195.  
  196.   io.WriteString("\[3mCiao Amigos!\[0m\n");
  197.  
  198. END SysDis.
  199.  
  200.  
  201.